МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра БІТ
Практична робота № 1
Блоковий шифр DES
з навчальної дисципліни: “Прикладна криптологія”
Львів – 2011
Завдання
Написати програму, яка здійснює шифрування і розшифрування тексту за допомогою блокового шифру DES
Теоретичний вступ
DES (англ. Data Encryption Standard) — це симетричний алгоритм шифрування даних, стандарт шифрування прийнятий урядом США із 1976 до кінця 1990-х, з часом набув міжнародного застосування. Ще з часу свого розроблення алгоритм викликав неоднозначні відгуки. Оскільки DES містив засекречені елементи своєї структури, породжувались побоювання щодо можливості контролю з боку Національного Агенства Безпеки США (англ. National Security Agency). Алгоритм піддавався критиці за малу довжину ключа, що, врешті, після бурних обговорень та контролю академічної громадськості, не завадило йому стати загальноприйнятим стандартом. DES дав поштовх сучасним уявленням про блочні алгоритми шифрування та криптоаналіз.
Зараз DES вважається ненадійним в основному через малу довжину ключа (56 біт) та розмір блоку (64 біти). У 1999 ключ DES було публічно дешифровано за 22 години 15 хвилин. Вважається, що алгоритм достатньо надійний для застосування у модифікації 3-DES, хоча існують розроблені теоретичні атаки. DES поступово витісняється алгоритмом AES, що з 2002 року є стандартом США.
Текст програми
<html>
<head>
<meta charset="utf-8">
<title>DES</title>
<link rel="stylesheet" type="text/css" title="default" media="screen" href="main.css">
<script type="text/javascript" src="parse.js"></script>
</head>
<body>
<div class="workfield" id="workfield">
<form name="io" method="post" action="des.php">
<input style="float:left" type="text" id="phrase" name="inputPhrase" value="">
<input style="float:left" type="text" id="key" name="key" maxlength="8" value="abcdefgh">
<input type="hidden" id="tmp" value="" />
<input type="submit" name="button" value="DES" class="button" onclick="getValues();">
</form>
<?php
echo '<div id="output" class="output">';
//1) bin is 64 bit array;
//each element of bin is 16bit and represented in binary;
//receive data from cookie as arr;
$bin = explode(",", $_COOKIE["phraseArrayBin"]);
$bin = str_split(implode("",$bin));
$key = explode(",", $_COOKIE["keyArrayBin"]);
$key = implode("", $key); //make one string from array;
$block = 64;
while((sizeof($bin) % $block) != 0) array_push($bin, '0');
echo "<br />Virgin text ___= ";array_show($bin);
$arr = array_chunk($bin, $block);
$bit = 16;
$encr = des($arr, $key, 0); binToDec($encr, $arr, $bit);
$decr = des($encr, $key, 1);$dec = binToDec($decr, $arr, $bit);
//$asd = "asd";
?>
<script type="text/javascript" >
var smth = "<?= join(",", $dec) ?>";
decoded = smth.split(",");
for (i = 0; i < decoded.length; i++)
decoded[i] = (String.fromCharCode(decoded[i]));
output.innerHTML += "<hr />Decoded = " + decoded.join("");
</script>
<?php
echo '</div>';
function des($arr, $key, $flag){
$result = array(array());
echo $whatWasDone = $flag == 0 ? "<hr />encryptedBin = " : "<br />decryptedBin = ";
for ($i = 0; $i < sizeof($arr); $i++){
//1) ip
$iped = ip($arr[$i]);
$phrase = cypher($iped, $key, $flag);
//5) (IP^(-1)) final permutation;
$iped_1 = ip_1($phrase);
$result[$i] = $iped_1;
array_show($result[$i]);
}
return $result;
}
function ip($arr){
$iped = array();
$ipOrder = array( "57", "49", "41", "33", "25", "17", "9", "1", "59", "51", "43", "35", "27", "19", "11", "3",
"61", "53", "45", "37", "29", "21", "13", "5", "63", "55", "47", "39", "31", "23", "15", "7",
"56", "48", "40", "32", "24", "16", "8", "0", "58", "50", "42", "34", "26", "18", "10", "2",
"60", "52", "44", "36", "28", "20", "12", "4", "62", "54", "46", "38", "30", "22", "14", "6");
for ($i = 0; $i < sizeof($ipOrder); $i++) $iped[$i] = $arr[$ipOrder[$i]];
return $iped;
}
function...